<?php

class MY_Model extends CI_Model
{
    var $table;
    var $primary_key;

    public function __construct($tabela = NULL, $primary_key = NULL)
    {
        parent::__construct();

        $this->table       = $tabela;
        $this->primary_key = $primary_key;
    }

    /**
     * Insere o objeto na base de dados
     * @param  string
     * @param  array/obj
     * @return int último id inserido
     */
    public function inserir($dados)
    {
    	$this->db->insert($this->table, $dados);

    	return $this->db->insert_id();
    }

    public function excluir_massa(array $id)
    {
        $this->db->where_in("cr_id", $id);
        $query = $this->db->delete($this->table);

        if ($query === FALSE)
        {
            return FALSE;
        }
        else 
        {
            $total_excluido = $this->db->affected_rows();
            return $total_excluido;
        }
    }

    public function excluir(array $id)
    {
        $retorno = array(
            'erro'            => FALSE,
            'linhas_afetadas' => 0
        );

        $this->db->where_in($this->primary_key, $id);
        $this->db->delete($this->table);

        if ($this->db->affected_rows() > 0)
        {
            $retorno['linhas_afetadas'] = $this->db->affected_rows();
            $this->_gera_log('DEL', $id);
        }
        else
        {
            $retorno['erro'] = $this->_erro_db();
        }

        return $retorno;
    }

    /**
     * Atualiza dados de uma tabela
     * @param  array  $id    id dos registros que serão alterados
     * @param  array  $dados dados para alterar conforme active record
     * @return mixed
     */
    public function alterar(array $id, array $dados)
    {
        $this->db->where_in($this->primary_key, $id);
        $this->db->update($this->table, $dados);

        $alterados = $this->db->affected_rows();

        if ($this->db->affected_rows() > 0) {
            $this->_gera_log('ALT', $id);
        }

        return $alterados;
    }

    private function _erro_db()
    {
        $erro = array(
            'numero'     => $this->db->_error_number(),
            'msg'        => $this->db->_error_message(),
            'custom_msg' => ''
        );

        switch ($erro['numero']) {
            case 1451:
                $erro['custom_msg'] = 'O registro não pode ser excluido porque está vinculado a outros registros';
                break;
            
            default:
                $erro['custom_msg'] = "Erro de banco de dados";
                break;
        }

        return $erro;
    }

    private function _gera_log($operacao, array $id_registros)
    {
        $registros = implode(',', $id_registros);

        $dados = array(
            'us_id' => $_SESSION['usuario']->us_id,
            'lg_operacao' => $operacao,
            'lg_tabela_alterada' => $this->table,
            'lg_ip' => $this->input->ip_address()
        );

        switch ($operacao) {
            case 'DEL':
                $dados['lg_descricao'] = $registros . ' | Foram excluídos';
                break;
            case 'ALT':
                $dados['lg_descricao'] = $registros . ' | Foram alterados';
                break;
            default:
                die('operacao não encontrada');
                break;
        }

        $this->db->insert('log', $dados);
    }

}